/*
 * @Author: szx
 * @Date: 2021-11-16 12:34:10
 * @LastEditTime: 2021-12-28 16:10:45
 * @Description:
 * @FilePath: \leetcode\1-99\78\78.js
 */
/**
 * @param {number[]} nums
 * @return {number[][]}
 */
// var subsets = function (nums) {
//     const res = [];
//     const tmp = [];
//     const n = nums.length;
//     const dfs = (i) => {
//         if (i === n) {
//             res.push(tmp.slice());
//             return;
//         }
//         tmp.push(nums[i]);
//         dfs(i + 1);
//         tmp.pop(n - 1);
//         dfs(i + 1);
//     };
//     dfs(0);
//     return res;
// };

// var subsets = function(nums) {
//     const ans = [];
//     const n = nums.length;
//     for (let mask = 0; mask < (1 << n); ++mask) {
//         const t = [];
//         for (let i = 0; i < n; ++i) {
//             if (mask & (1 << i)) {
//                 t.push(nums[i]);
//             }
//         }
//         ans.push(t);
//     }
//     return ans;
// };

var subsets = function (nums) {
    const res = [];
    const len = nums.length;

    const backtrack = (path, index) => {
        if (path.length > len) return;
        res.push(Array.from(path));
        for (let i = index; i < len; i++) {
            path.push(nums[i]);
            backtrack(path, i+1);
            path.pop();
        }
    };
    backtrack([], 0);
    return res;
};
console.log(subsets([1, 2, 3]));
